package com.general.framework.example.proxy.jdkProxy;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

/**
 *
 * 1 JDK动态代理
 *         简介: JDK 动态代理是 Java 内置的一种代理机制，它只适用于代理接口实现类，也就是说目标对象必须实现一个或多个接口。
 *         实现方式: 使用 java.lang.reflect.Proxy 类和 InvocationHandler 接口来实现动态代理。
 *         优点: 简单易用，直接支持接口代理，适用于大多数场景。
 *         缺点: 只能代理实现了接口的类，无法代理普通的类。
 *
 *
 *2 CGLIB 动态代理
 *         简介: CGLIB (Code Generation Library) 是一个第三方库，可以动态生成字节码来创建代理对象。与 JDK 动态代理不同，CGLIB 可以代理普通类（非接口）。
 *         实现方式: 通过继承目标类并重写方法实现代理，这也是为什么 CGLIB 不能代理 final 类或 final 方法。
 *         优点: 可以代理没有实现接口的类，性能通常比 JDK 代理快。
 *         缺点: 需要额外的库（CGLIB），不能代理 final 类或方法。
 *
 */

public class UserServiceProxy {
    public static void main(String[] args) {
        // 创建目标对象
        UserServiceImpl target = new UserServiceImpl();

        // 创建代理对象
        UserService proxy = (UserService) Proxy.newProxyInstance(
                target.getClass().getClassLoader(),
                target.getClass().getInterfaces(),
                new InvocationHandler() {
                    @Override
                    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                        System.out.println("执行方法前: " + method.getName());
                        Object result = method.invoke(target, args); // 调用目标对象的方法
                        System.out.println("执行方法后: " + method.getName()); // 这里可以添加一些额外的逻辑
                        return result;
                    }
                }
        );

        // 调用代理对象的方法
        proxy.addUser("张三");
    }
}
